home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 25 / AACD 25.iso / AACD / Magazine / Online / QMail / source / tcpto.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-15  |  3.5 KB  |  166 lines

  1. #include "tcpto.h"
  2. #include "open.h"
  3. #include "lock.h"
  4. #include "seek.h"
  5. #include "now.h"
  6. #include "ip.h"
  7. #include "byte.h"
  8. #include "datetime.h"
  9. #include "readwrite.h"
  10.  
  11. char tcpto_buf[1024];
  12.  
  13. static int flagwasthere;
  14. static int fdlock;
  15.  
  16. static int getbuf()
  17. {
  18.  int r;
  19.  int fd;
  20.  
  21.  fdlock = open_write("queue/lock/tcpto");
  22.  if (fdlock == -1) return 0;
  23.  fd = open_read("queue/lock/tcpto");
  24.  if (fd == -1) { close(fdlock); return 0; }
  25.  if (lock_ex(fdlock) == -1) { close(fdlock); close(fd); return 0; }
  26.  r = read(fd,tcpto_buf,sizeof(tcpto_buf));
  27.  close(fd);
  28.  if (r < 0) { close(fdlock); return 0; }
  29.  r >>= 4;
  30.  if (!r) close(fdlock);
  31.  return r;
  32. }
  33.  
  34. int tcpto(ip) struct ip_address *ip;
  35. {
  36.  int n;
  37.  int i;
  38.  char *record;
  39.  datetime_sec when;
  40.  
  41.  flagwasthere = 0;
  42.  
  43.  n = getbuf();
  44.  if (!n) return 0;
  45.  close(fdlock);
  46.  
  47.  record = tcpto_buf;
  48.  for (i = 0;i < n;++i)
  49.   {
  50.    if (byte_equal(ip->d,4,record))
  51.     {
  52.      flagwasthere = 1;
  53.      if (record[4] >= 2)
  54.       {
  55.        when = (unsigned long) (unsigned char) record[11];
  56.        when = (when << 8) + (unsigned long) (unsigned char) record[10];
  57.        when = (when << 8) + (unsigned long) (unsigned char) record[9];
  58.        when = (when << 8) + (unsigned long) (unsigned char) record[8];
  59.  
  60.        if (now() - when < ((60 + (getpid() & 31)) << 6))
  61.      return 1;
  62.       }
  63.      return 0;
  64.     }
  65.    record += 16;
  66.   }
  67.  return 0;
  68. }
  69.  
  70. void tcpto_err(ip,flagerr) struct ip_address *ip; int flagerr;
  71. {
  72.  int n;
  73.  int i;
  74.  char *record;
  75.  datetime_sec when;
  76.  datetime_sec firstwhen;
  77.  int firstpos;
  78.  datetime_sec lastwhen;
  79.  
  80.  if (!flagerr)
  81.    if (!flagwasthere)
  82.      return; /* could have been added, but not worth the effort to check */
  83.  
  84.  n = getbuf();
  85.  if (!n) return;
  86.  
  87.  record = tcpto_buf;
  88.  for (i = 0;i < n;++i)
  89.   {
  90.    if (byte_equal(ip->d,4,record))
  91.     {
  92.      if (!flagerr)
  93.        record[4] = 0;
  94.      else
  95.       {
  96.        lastwhen = (unsigned long) (unsigned char) record[11];
  97.        lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[10];
  98.        lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[9];
  99.        lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[8];
  100.        when = now();
  101.  
  102.        if (record[4] && (when < 120 + lastwhen)) { close(fdlock); return; }
  103.  
  104.        if (++record[4] > 10) record[4] = 10;
  105.        record[8] = when; when >>= 8;
  106.        record[9] = when; when >>= 8;
  107.        record[10] = when; when >>= 8;
  108.        record[11] = when;
  109.       }
  110.      if (seek_set(fdlock,i << 4) == 0)
  111.        if (write(fdlock,record,16) < 16)
  112.          ; /*XXX*/
  113.      close(fdlock);
  114.      return;
  115.     }
  116.    record += 16;
  117.   }
  118.  
  119.  if (!flagerr) { close(fdlock); return; }
  120.  
  121.  record = tcpto_buf;
  122.  for (i = 0;i < n;++i)
  123.   {
  124.    if (!record[4]) break;
  125.    record += 16;
  126.   }
  127.  
  128.  if (i >= n)
  129.   {
  130.    firstpos = -1;
  131.    record = tcpto_buf;
  132.    for (i = 0;i < n;++i)
  133.     {
  134.      when = (unsigned long) (unsigned char) record[11];
  135.      when = (when << 8) + (unsigned long) (unsigned char) record[10];
  136.      when = (when << 8) + (unsigned long) (unsigned char) record[9];
  137.      when = (when << 8) + (unsigned long) (unsigned char) record[8];
  138.      when += (record[4] << 10);
  139.      if ((firstpos < 0) || (when < firstwhen))
  140.       {
  141.        firstpos = i;
  142.        firstwhen = when;
  143.       }
  144.      record += 16;
  145.     }
  146.    i = firstpos;
  147.   }
  148.  
  149.  if (i >= 0)
  150.   {
  151.    record = tcpto_buf + (i << 4);
  152.    byte_copy(record,4,ip->d);
  153.    when = now();
  154.    record[8] = when; when >>= 8;
  155.    record[9] = when; when >>= 8;
  156.    record[10] = when; when >>= 8;
  157.    record[11] = when;
  158.    record[4] = 1;
  159.    if (seek_set(fdlock,i << 4) == 0)
  160.      if (write(fdlock,record,16) < 16)
  161.        ; /*XXX*/
  162.   }
  163.  
  164.  close(fdlock);
  165. }
  166.